<?php

require_once 'Objeto.php';
require_once 'BancoDeDados.php';

class EstadoObjeto {

    private $cod_estado_objeto;
    private $descricao;
    private $data_verificacao;
    private $responsavel;
    private $anotacoes;
    private $objeto;
    private $vinculado;

    public function &getcod_estado_objeto() {
        return $this->cod_estado_objeto;
    }

    public function setcod_estado_objeto(&$cod_estado_objeto) {
        $this->cod_estado_objeto = &$cod_estado_objeto;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    public function &getData_verificacao() {
        return $this->data_verificacao;
    }

    public function setData_verificacao(&$data_verificacao) {
        $this->data_verificacao = &$data_verificacao;
    }

    public function &getResponsavel() {
        return $this->responsavel;
    }

    public function setResponsavel(&$responsavel) {
        $this->responsavel = &$responsavel;
    }

    public function &getAnotacoes() {
        return $this->anotacoes;
    }

    public function setAnotacoes(&$anotacoes) {
        $this->anotacoes = &$anotacoes;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Estado de Objeto existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into estado_objeto (descricao) values(?)');
        $result = $link->execute($stmt, array($this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from estado_objeto');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $estadoObjeto = new EstadoObjeto();
            $estadoObjeto->setcod_estado_objeto($row['cod_estado_objeto']);
            $estadoObjeto->setDescricao($row['descricao']);
            $estadoObjeto->setVinculado($estadoObjeto->verificarVinculacao());
            $resultado[] = &$estadoObjeto;
            unset($estadoObjeto);
        }
        return $resultado;
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao' && $this->descricao != $campo_valor) {
            $this->descricao = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Estado de Objeto existente");
            }
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update estado_objeto set ' . $campo_id . ' = ? where cod_estado_objeto = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_estado_objeto));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function consultar(Objeto &$objeto) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select e_o.cod_estado_objeto, descricao, anotacoes, data_verificacao, responsavel from objeto_estado_objeto o_e_o, estado_objeto e_o where o_e_o.cod_estado_objeto = e_o.cod_estado_objeto and cod_interno = ?', array($objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("Estado de Objeto inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um Estado de Objeto com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $estadoObjeto = new EstadoObjeto();
        $estadoObjeto->setcod_estado_objeto($row['cod_estado_objeto']);
        $estadoObjeto->setDescricao($row['descricao']);
        $estadoObjeto->setAnotacoes($row['anotacoes']);
        $estadoObjeto->setData_verificacao($row['data_verificacao']);
        $estadoObjeto->setResponsavel($row['responsavel']);
        return $estadoObjeto;
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from estado_objeto where cod_estado_objeto = ?');
        $result = $link->execute($stmt, array($this->cod_estado_objeto));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_estado_objeto from estado_objeto where descricao = ?', array($this->descricao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }

    private function verificarVinculacao() {

        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_estado_objeto from objeto_estado_objeto where cod_estado_objeto = ?', array($this->cod_estado_objeto));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 1;
        }
        return 0;
    }

    public function cadastrarObjeto() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_estado_objeto from objeto_estado_objeto where cod_estado_objeto = ? and cod_interno = ?', array($this->cod_estado_objeto, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            throw new Exception('Estado de Objeto existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into objeto_estado_objeto (cod_interno, cod_estado_objeto, anotacoes, data_verificacao, responsavel) values(?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno(), $this->cod_estado_objeto, $this->anotacoes, $this->data_verificacao, $this->responsavel));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarObjeto(&$campo_id, &$campo_valor) {
        if ($campo_id == 'anotacoes' && $this->anotacoes != $campo_valor) {
            $this->anotacoes = &$campo_valor;
        } elseif ($campo_id == 'data_verificacao' && $this->data_verificacao != $campo_valor) {
            $this->data_verificacao = &$campo_valor;
        } elseif ($campo_id == 'responsavel' && $this->responsavel != $campo_valor) {
            $this->responsavel = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto_estado_objeto set ' . $campo_id . ' = ? where cod_estado_objeto = ? and cod_interno = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_estado_objeto, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluirObjeto() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from objeto_estado_objeto where cod_estado_objeto = ? and cod_interno = ?');
        $result = $link->execute($stmt, array($this->cod_estado_objeto, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

}
?>